Оболочка.отд
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                          ОТДЕЛ Оболочка+;
(****************************************************************************** 
 * НАЗНАЧЕНИЕ: ввод и преобразование программ на Глаголе
 *               в Графическом или Консольном Окне 
 ******************************************************************************)
ИСПОЛЬЗУЕТ
  Положение, 
  ПолеПриложение, 
  ПолеНастройки, 
  ПолеПоискЗамена, 
  Знак               ИЗ "...\ Отделы\Иное\", 
  Цепь               ИЗ "...\ Отделы\Иное\", 
  Текст              ИЗ "...\ Отделы\Числа\", 
  ОС                 ИЗ "...\ Отделы\Обмен\", 
  Окно               ИЗ "...\ Отделы\Обмен\", 
  Файл               ИЗ "...\ Отделы\Обмен\", 
  Ввод               ИЗ "...\ Отделы\Обмен\", 
  Читать             ИЗ "...\ Отделы\Обмен\", 
  Писать             ИЗ "...\ Отделы\Обмен\", 
  Справка            ИЗ "...\ Отделы\Обмен\", 
  Рамка              ИЗ "...\ Отделы\Поле\", 
  Надел              ИЗ "...\ Отделы\Поле\", 
  Поле               ИЗ "...\ Отделы\Поле\", 
  ПолеВвода          ИЗ "...\ Отделы\Поле\", 
  ПолеСВосклицанием  ИЗ "...\ Отделы\Поле\", 
  ПолеСВопросом      ИЗ "...\ Отделы\Поле\", 
  Закладки           ИЗ "...\ Отделы\Поле\", 
  Кнопка             ИЗ "...\ Отделы\Поле\", 
  Памятка            ИЗ "...\ Отделы\Поле\", 
  Холст              ИЗ "...\ Отделы\Поле\";

ПОСТ
                (* начальный размер поля *)
  Строк  = 30;
  Колонок= 80;
                (* действия кнопок *)
  дПомощь   = 1;
  дСохранить= 2;
  дОткрыть  = 3;
  дИскать   = 4;
  дНастроить= 5;
  дЗапуск   = 6;
  дВыход    = 7;

ПЕР
  поле:Поле.Доступ;           (* поле приложения *)
  закладки:Закладки.Доступ;   (* закладки для холстов *)
  положение:Положение.Доступ; (* положение указки на текущем холсте *)
  наВесьЭкран:КЛЮЧ;           (* текущий размер поля *)

(******************************************************************************)
ЗАДАЧА ДПолеНаВесьЭкран;
(* Расширяет поле на весь экран или восстанавливает его исходный размер *)
ПЕР
  всегоСтрок,всегоКолонок:ЦЕЛ;
  строк,колонок:ЦЕЛ;
УКАЗ
  ЕСЛИ наВесьЭкран ТО (* уже расширено *)
    строк:=Строк;
    колонок:=Колонок
  ИНАЧЕ
    Окно.РазмерЭкрана(всегоСтрок,всегоКолонок);
    строк:=всегоСтрок-3;
    колонок:=всегоКолонок
  КОН;
  наВесьЭкран:=НЕ наВесьЭкран;
  Рамка.Подготовить(поле,0,0,строк,колонок);
  Поле.ОкноНаВсёПоле(поле);
  Поле.Рисовать(поле)
КОН ДПолеНаВесьЭкран;

(******************************************************************************)
ЗАДАЧА ДПомощь;   (* Неотложная помощь F1 *)
УКАЗ
  Справка.Раздел("Obolochka.htm")
КОН ДПомощь;

(******************************************************************************)
ЗАДАЧА ДСправка;  (* Справка по отделам Ctrl-F1 *)
ПЕР
  понятие:ЦЕПЬ[100];
  холст:Холст.Доступ;
УКАЗ
  холст:=закладки.холст;
  ЕСЛИ холст = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  Холст.ПонятиеВЦепь(холст,понятие);
  Справка.Ключ(понятие)
КОН ДСправка;

(******************************************************************************)
ЗАДАЧА ДОткрытьФайл;
ПЕР
  имяФайла:Файл.ВПолного;
УКАЗ
  имяФайла:="";
  ЕСЛИ
    ПолеВвода.Выполнить("Открыть",50,поле,4,"введите имя файла",имяФайла) = Поле.сДалее
  ТО
    Закладки.Открыть(закладки,имяФайла)
  КОН
КОН ДОткрытьФайл;

(******************************************************************************)
ЗАДАЧА ДСохранитьКак(холст:Холст.Доступ);
ПЕР
  имяФ:Файл.ВПолного;
УКАЗ
  ЕСЛИ холст = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  имяФ:=холст.имяФ;
  ЕСЛИ
    ПолеВвода.Выполнить("Сохранить",50,поле,0,"введите имя файла",имяФ) = Поле.сДалее
  ТО
    ЕСЛИ Холст.ПисатьВФайл(холст,имяФ) ТО 
      Закладки.Открыть(закладки,имяФ)
    КОН
  КОН
КОН ДСохранитьКак;

(******************************************************************************)
ЗАДАЧА ДСохранитьХолст(холст:Холст.Доступ);
УКАЗ
  ЕСЛИ холст = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  ЕСЛИ Холст.СохранитьВФайл(холст) ТО
  КОН
КОН ДСохранитьХолст;

(******************************************************************************)
ЗАДАЧА ДЗакрытьХолст(холст:Холст.Доступ);
ПЕР
  ответ:ЦЕЛ;
  вопрос:ЦЕПЬ[100];
УКАЗ
  ЕСЛИ холст = ПУСТО ТО
    ВОЗВРАТ
  КОН;
  ЕСЛИ холст.изменён = "*" ТО
    вопрос:="Сохранить отдел ";
    Цепь.Добавить(вопрос,холст.имя);
    Цепь.Добавить(вопрос," ?");
    ответ:=ПолеСВопросом.Выполнить("Вопрос",1,ДЛИНА(вопрос),поле,0,вопрос);
    ЕСЛИ ответ = Поле.сОтмена ТО
      ВОЗВРАТ
    КОН;
    ЕСЛИ ответ = ПолеСВопросом.сДа ТО
      ДСохранитьХолст(холст)
    КОН
  КОН;
  Закладки.Удалить(закладки)
КОН ДЗакрытьХолст;

(******************************************************************************)
ЗАДАЧА ДИскать(заменить,сПолем,наоборот:КЛЮЧ);
ПЕР
  холст:Холст.Доступ;
УКАЗ
  холст:=закладки.холст;
  ЕСЛИ холст # ПУСТО ТО
    Холст.поиск.заменить:=заменить;
    ЕСЛИ наоборот ТО
      Холст.поиск.обратный:=НЕ Холст.поиск.обратный
    КОН;
    ЕСЛИ сПолем ТО
      ЕСЛИ ПолеПоискЗамена.Выполнить(поле,холст) = Поле.сДалее ТО
        Холст.ИскатьЗаменить(холст,ОТКЛ)
      КОН
    ИНАЧЕ
      Холст.ИскатьЗаменить(холст,ВКЛ)
    КОН;
    (* восстановим обратный поиск *)
    ЕСЛИ наоборот ТО
      Холст.поиск.обратный:=НЕ Холст.поиск.обратный
    КОН
  КОН
КОН ДИскать;

(******************************************************************************)
ЗАДАЧА ДНастроить;
УКАЗ
  ПолеПриложение.Выполнить(поле)
КОН ДНастроить;

(******************************************************************************)
ЗАДАЧА БылаОшибка(файлОбмена-:ЦЕПЬ):КЛЮЧ;
(* Цель:  отработать сообщение об ошибке преобразования 
 * До:    <файлОбмена> - имя файла, в котором находятся сообщения от ПГ
 * Ответ: ВКЛ, если ошибка была найдена *)
ПЕР
  поток:Читать.Поток; (* сообщения от ПГ *)
  цепь:ЦЕПЬ[200];
  поз:ЦЕЛ;
  имяФайла:Файл.ВПолного;   
  с,к:ЦЕЛ; (* строка, колонка ошибки *)
  былаОшибка:КЛЮЧ;
  холст:Холст.Доступ;
УКАЗ
  былаОшибка:=ОТКЛ;
  поток:=Читать.Открыть(файлОбмена);
  ЕСЛИ поток # ПУСТО ТО
    поток.видЗнаков:=Читать.знДос;
    ПОКА Читать.НачалоСтроки(поток) И (НЕ былаОшибка) ВЫП
      Читать.Строка(поток,цепь);
      поз:=Цепь.Позиция(" (",цепь,0);
      ЕСЛИ (поз # -1) И Знак.Цифра(цепь[поз+2])
      ТО                              (* кажется нашли сообщение об ошибке *)
        Цепь.Часть(цепь,имяФайла,0,поз);       (* выделяем файл отдела *)
        УВЕЛИЧИТЬ(поз,2);                     (* выделяем позицию в файле *)
        с:=Текст.ВЦел(цепь,поз);
        УВЕЛИЧИТЬ(поз);
        к:=Текст.ВЦел(цепь,поз);
        (* выделяем пояснение *)
        Цепь.Часть(цепь,цепь,поз+4,РАЗМЕР(цепь));
        Цепь.Вставить("Ошибка - ",цепь,0);
        (* выводим предупредительную надпись *)
        Закладки.ВыводОшибки(закладки,имяФайла,с,к,цепь);
        былаОшибка:=ВКЛ
      КОН
    КОН;
    (* закрываем файл *)
    Читать.Закрыть(поток)
  КОН;
  ВОЗВРАТ былаОшибка
КОН БылаОшибка;

(******************************************************************************)
ЗАДАЧА ДЗапуск;
   (* Файл Оболочка.exe обязательно должен находится в папке \Глагол\Службы\ *)
ПОСТ
  файлОбмена="ПГ.обм";                 (* сюда перенаправляется вывод от ПГ *)
ПЕР
                   (* путь к папке приложения относительно \Глагол\Службы\ *)
  текПуть:Файл.ВПути;
                                             (* имя файла головного отдела *)
  имяФайла:Файл.ВПолного;
                                                   (* имя головного отдела *)
  имяОтдела:Файл.ВИмени;
               (* командная строка для вызова \Глагол\Службы\Построить.bat *)
  комСтрока:Файл.ВПолного;

  ЗАДАЧА ПросмотрОшибкиСборки;
                (* посмотрим, что же произошло при преобразовании и сборке *)
  УКАЗ
    комСтрока:="type ";
    Цепь.Добавить(комСтрока,файлОбмена);
    ОС.Вызов(комСтрока);
          (* не будем удалять файл 0,5с, чтобы "type" успела его прочитать *)
    ОС.Спать(500) 
  КОН ПросмотрОшибкиСборки;

УКАЗ
  ПолеНастройки.СписатьИмяФайла(имяФайла);
  ЕСЛИ имяФайла = "" ТО
    ВОЗВРАТ
  КОН;
  Закладки.СохранитьИзменённые(закладки);
  ПолеНастройки.РазобратьФайлНастроек;
                              (* подготовка переменных для Построить.bat *)
  ОС.ПисатьВПерОкружения("slujput",".");
  Файл.ПутьИзПолного(имяФайла,текПуть);
  ОС.ПисатьВПерОкружения("tekput",текПуть);
                                                  (* вызов Построить.bat *)
  Файл.ИмяИзПолного(имяФайла,имяОтдела);
  ЕСЛИ ПолеНастройки.МПГ ТО
    комСтрока:="ПостроитьМ "
  ИНАЧЕ
    ВЫБРАТЬ ПолеНастройки.видПриложения ИЗ
    | ПолеНастройки.впТекстовое: комСтрока:="Построить "
    | ПолеНастройки.впОконное:   комСтрока:="ПостроитьО "
    | ПолеНастройки.впБиблиотека:комСтрока:="ПостроитьБ "
    КОН
  КОН;
  Цепь.Добавить(комСтрока,имяОтдела);
  ОС.ВызовВФайл(комСтрока,файлОбмена);
                                       (* обрабатываем сообщения от ПГ *)
  ЕСЛИ НЕ БылаОшибка(файлОбмена) ТО    (* получен файл приложения ? *)
    СПИСАТЬ(текПуть,комСтрока);
    Цепь.Добавить(комСтрока,имяОтдела);
    ЕСЛИ (НЕ ПолеНастройки.МПГ)
        И 
         (ПолеНастройки.видПриложения = ПолеНастройки.впБиблиотека)
    ТО
      Цепь.Добавить(комСтрока,".dll");
      ЕСЛИ НЕ Файл.Существует(комСтрока) ТО
        ПросмотрОшибкиСборки
      КОН
    ИНАЧЕ
      Цепь.Добавить(комСтрока,".exe");
      ЕСЛИ НЕ Файл.Существует(комСтрока) ТО
        ПросмотрОшибкиСборки
      ИНАЧЕ        (* вызов построенного приложения *)
        ЕСЛИ НЕ ПолеНастройки.МПГ ТО
          ОС.Вызов(комСтрока)
        КОН
      КОН
    КОН
  КОН;
  ЕСЛИ ОС.УдалитьФ(файлОбмена) ТО КОН
КОН ДЗапуск;

(******************************************************************************)
ЗАДАЧА ДВыход;
ПЕР
  ответ:ЦЕЛ;
УКАЗ
  ЕСЛИ Закладки.СИзменениями(закладки) ТО
    ответ:=ПолеСВопросом.Выполнить("Вопрос",1,0,поле,0,"Сохранить отделы ?");
    ЕСЛИ ответ = Поле.сОтмена ТО
      ВОЗВРАТ
    КОН;
    ЕСЛИ ответ = ПолеСВопросом.сДа ТО
      Закладки.СохранитьИзменённые(закладки)
    КОН
  КОН;
  поле.состояние:=дВыход
КОН ДВыход;

(******************************************************************************)
ЗАДАЧА ДПерейти;
ПЕР
  цепь:ЦЕПЬ[20];
  с,к:ЦЕЛ;
  поз:ЦЕЛ;
УКАЗ
  цепь:="";
  ЕСЛИ
    ПолеВвода.Выполнить("Перейти",22,поле,6,
              "введите номер строки и колонки через пробел",цепь) = Поле.сДалее
  ТО
    поз:=0;
    с:=Текст.ВЦел(цепь,поз);
    к:=1;
    УВЕЛИЧИТЬ(поз);
    ЕСЛИ поз < ДЛИНА(цепь) ТО
      к:=Текст.ВЦел(цепь,поз)
    КОН;
    Холст.ВыставитьУказку(закладки.холст,с-1,к-1)
  КОН
КОН ДПерейти;

(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
ПЕР
  код:ЦЕЛ;
УКАЗ
  ДЛЯ посылка ВИДА
  | Ввод.ОтКлавиш:
      код:=посылка.код;
      посылка.код:=0;                  (* скорее всего отработаем посылку *)
      ЕСЛИ посылка.упрАльт ТО
        ВЫБРАТЬ код ИЗ
(* F1  *) | 70H: ДПомощь
(* F3  *) | 72H: ДЗакрытьХолст(закладки.холст)
(* F7  *) | 76H: ДИскать(ОТКЛ,ОТКЛ,ВКЛ)
(* F8  *) | 77H: ДПерейти
(* "X" *) | 58H: ДВыход
        ИНАЧЕ
          посылка.код:=код
        КОН
      АЕСЛИ посылка.упрШифт ТО
        ВЫБРАТЬ код ИЗ
(* F2  *) | 71H: ДСохранитьКак(закладки.холст)
(* F7  *) | 76H: ДИскать(ОТКЛ,ОТКЛ,ОТКЛ)
        ИНАЧЕ
          посылка.код:=код
        КОН
      АЕСЛИ посылка.упрКонтр ТО
        ВЫБРАТЬ код ИЗ
(* Tab *) |  9H: Закладки.Следующая(закладки)
(* F1  *) | 70H: ДСправка
(* F7  *) | 76H: ДИскать(ВКЛ,ВКЛ,ОТКЛ)
        ИНАЧЕ
          посылка.код:=код
        КОН
      ИНАЧЕ
        ВЫБРАТЬ код ИЗ
(* F1  *) | 70H: ДПомощь
(* F2  *) | 71H: ДСохранитьХолст(закладки.холст)
(* F3  *) | 72H: ДОткрытьФайл
(* F5  *) | 74H: ДПолеНаВесьЭкран
(* F7  *) | 76H: ДИскать(ОТКЛ,ВКЛ,ОТКЛ)
(* F8  *) | 77H: ДНастроить
(* F9  *) | 78H: ДЗапуск
(* F10 *) | 79H: ДВыход
        ИНАЧЕ
          посылка.код:=код
        КОН
      КОН
  | Холст.Посылка:
      положение.Приём(положение,посылка)
  | Кнопка.Посылка:
      ВЫБРАТЬ посылка.кнопка.действие ИЗ
      | дПомощь   : ДПомощь
      | дСохранить: ДСохранитьХолст(закладки.холст)
      | дОткрыть  : ДОткрытьФайл
      | дИскать   : ДИскать(ОТКЛ,ВКЛ,ОТКЛ)
      | дНастроить: ДНастроить
      | дЗапуск   : ДЗапуск
      | дВыход    : ДВыход
      КОН
  ИНАЧЕ
  КОН             
КОН Приём;

(******************************************************************************)
ЗАДАЧА СоздатьПоле;
(* создаёт рабочее поле экрана *)
ПЕР
  кнПомощь,кнСохранить,кнОткрыть,кнИскать:Кнопка.Доступ;
  кнНастроить,кнЗапуск,кнВыход:Кнопка.Доступ;
УКАЗ
                                                       (* создаём поле *)
  наВесьЭкран:=ОТКЛ;
  поле:=Поле.Создать(0,0,Строк,Колонок,ПУСТО,ОТКЛ,Приём);
                                                     (* создаём наделы *)
  закладки:=Закладки.Создать(0,0,-1,0);
  (*|00000000001111111111222222222233333333334444444444555555555566|*)
  (*|01234567890123456789012345678901234567890123456789012345678901|*)
  (*| Помощь  Сохранить  Открыть  Искать  Настроить  Запуск  Выход |*) 
  кнПомощь    :=Кнопка.Создать(-1,0, " ~Помощь "   ,дПомощь   ,ОТКЛ); 
  кнСохранить :=Кнопка.Создать(-1,8, " ~Сохранить ",дСохранить,ОТКЛ); 
  кнОткрыть   :=Кнопка.Создать(-1,19," ~Открыть "  ,дОткрыть  ,ОТКЛ); 
  кнИскать    :=Кнопка.Создать(-1,28," ~Искать "   ,дИскать   ,ОТКЛ); 
  кнНастроить :=Кнопка.Создать(-1,36," ~Настроить ",дНастроить,ОТКЛ); 
  кнЗапуск    :=Кнопка.Создать(-1,47," ~Запуск "   ,дЗапуск   ,ОТКЛ); 
  кнВыход     :=Кнопка.Создать(-1,55," ~Выход "    ,дВыход    ,ОТКЛ); 
  положение:=Положение.Создать(-1,62);
                  (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(поле,закладки);
  Поле.ДобавитьНадел(поле,кнПомощь);
  Поле.ДобавитьНадел(поле,кнСохранить);
  Поле.ДобавитьНадел(поле,кнОткрыть);
  Поле.ДобавитьНадел(поле,кнИскать);
  Поле.ДобавитьНадел(поле,кнНастроить);
  Поле.ДобавитьНадел(поле,кнЗапуск);
  Поле.ДобавитьНадел(поле,кнВыход);
  Поле.ДобавитьНадел(поле,положение)
КОН СоздатьПоле;

(******************************************************************************)
ЗАДАЧА Поехали;
ПЕР
  п:Писать.Поток;
  ч:Читать.Поток;
УКАЗ
  Справка.Подготовить("Глагол.chm");
                                        (* восстанавливаем настройки *)
  ч:=Читать.Открыть("Оболочка.нст");
  ЕСЛИ ч # ПУСТО ТО
    ч.видЗнаков:=Читать.знУни;
    Памятка.ЧитатьНастройки(ч);
    ПолеПоискЗамена.ЧитатьНастройки(ч);
    Читать.Закрыть(ч)
  КОН;

  Окно.Графическое("Оболочка","Lucida Sans Unicode",16,ПУСТО);
(*
  Окно.Текстовое(ПУСТО);
                *)
  СоздатьПоле;
  Поле.ОкноНаВсёПоле(поле);
  Поле.Рисовать(поле);
  Окно.Показать;
                                        (* основная работа *)
  ПОВТОРЯТЬ
    Поле.Проверить(поле)
  ДО поле.состояние # Поле.сРабота;
                                        (* сохраняем настройки *)
  п:=Писать.Открыть("Оболочка.нст");
  ЕСЛИ п # ПУСТО ТО
    п.видЗнаков:=Писать.знУни;
    Памятка.ПисатьНастройки(п);
    ПолеПоискЗамена.ПисатьНастройки(п);
    Писать.Закрыть(п)
  КОН
КОН Поехали;

(******************************************************************************)
УКАЗ
  Поехали
КОН Оболочка.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол     ◄Азбука     ◄Задачи на Глаголе     Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы